package operation;

import books.Book;
import books.BookList;
import user.NormalUser;

import java.util.Scanner;

/**
 * 删除图书
 * DelOperation 实现接口 IOperation
 * 重写接口中的 work 的抽象方法
 * 1.首先找到该书籍存在的下标位置，
 * 2，通过尾删法，从 pos +1 的位置前移动
 * 3.顺序表的有效值减一
 */
public class DelOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        Scanner scanner = new Scanner(System.in);
        String name = null;

        System.out.println("请输入删除的书名:");
        name = scanner.nextLine();
        int i = 0;
        for ( i = 0; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getBooks(i);

            if(book.getName().equals(name)) {
                break;                                // 找到了，跳出循环
            }
        }

        /*
        * 判断跳出循环是因为 找到了，还是没有找到
        * 当 i 等于 顺序表的长度，表示没有找到，因为数组的下标，访问从 0 开始
         */
        if(i == bookList.getUsedSize()) {
            System.out.println("抱歉，没有你要删除的书籍");
            return ;                      // 没有直接退出后面的插入的执行
        }

        /*
        尾删法，从pos + 1的位置从后向前覆盖，删除
        * */
        for (int pos = i; pos < bookList.getUsedSize()-1; pos++) {
            // 注意这里的bookList.getUsedSize()-1 数组的长度减1  ，因为数组的有效长度是没有值的，
            // 数组从 0 开始计数的
          /* bookList[pos] = bookList[pos+1];
          * 这是错误的
          * 错在哪里 ？？？
          * boolList[pos] 不是数组，更不是顺序表，是一个类
          * boolList 只是一个存放，定义了顺序表的一个类，它不是数组，而是通过
          * 它间接的访问到我们的 一个顺序表
          * 该类中有一个顺序表 book*/

            Book book = bookList.getBooks(pos + 1);       // 取出要删除节点的后一个节点
            bookList.setBooks(pos,book);                       // 覆盖要删除的节点

        }

        bookList.setUsedSize(bookList.getUsedSize() - 1);       // 跳出循环，顺序表的有效长度 -1
        System.out.println("删除成功");

        return ;
    }
}
